const express = require('express')
const app = express()
const port = process.env.PORT || 5000

// 导入body-parser 
const bodyParser = require('body-parser')

const users = require('./routes/api/users')
const profile = require('./routes/api/profile')

// 使用body-parser 中间件
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// 在 app.js 中，所有路由之前，声明一个全局中间件，为 res 对象挂载一个 res.cc() 函数 
app.use((req,res,next) => {
    res.cc = function(err,status=400){
       res.send({
        status,
        // 状态描述，判断 err 是 错误对象 还是 字符串
        message:err instanceof Error ? err.message:err
       })
    }
    next()
})

// 在 server.js 中注册路由之前，配置解析 Token 的中间件
const expressJWT = require('express-jwt')
const keys = require('./config/token')

app.use(expressJWT
    ({secret:keys.jwtSecretKey,
     algorithms:['HS256']})
     .unless({path:[/^\/api\//]
    }))


// 测试服务器是否连接的接口
app.get('/', (req, res) => res.send('Hello World!'))
// 注册接口
app.use("/api/users",users)
app.use("/api/profile",profile)

// 错误中间件
app.use(function (err, req, res, next) {
  
    // 捕获 token 身份认证失败的错误
    if (err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
  
  })


app.listen(port, () => console.log(`Example app listening on port ${port}!`))